package com.wpen.unit.infra.repository.job.impl;

import java.io.Serializable;
import java.util.List;

import com.wpen.unit.infra.repository.job.TaskExecLogRepository;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.baomidou.mybatisplus.extension.toolkit.SqlHelper;
import com.wpen.unit.exception.UpdateZeroException;
import com.wpen.unit.infra.mybatis.job.mapper.TaskExecLogMapper;
import com.wpen.unit.infra.mybatis.job.po.TaskExecLogPo;
import com.wpen.unit.infra.mybatis.job.po.TaskExecLogPo.TaskExecLogColumns;
import com.wpen.unit.utils.StringUtil;

/**
 * 任务执行日志维护.
 * 
 * @author pg
 *
 */
@Repository
@Transactional
public class TaskExecLogRepositoryImpl extends ServiceImpl<TaskExecLogMapper, TaskExecLogPo>
		implements TaskExecLogRepository {

	@Override
	public List<TaskExecLogPo> queryListByBatchId(Long batchId, Long batchTriggerTime, String bizCode, String batchCode,
			String taskCode) {
		QueryWrapper<TaskExecLogPo> queryWrapper = Wrappers.query();
		queryWrapper.eq(TaskExecLogColumns.BATCH_EXEC_LOG_ID.name(), batchId);
		queryWrapper.eq(TaskExecLogColumns.BATCH_TRIGGER_TIME.name(), batchTriggerTime);
		queryWrapper.eq(TaskExecLogColumns.BIZ_CODE.name(), bizCode);
		queryWrapper.eq(TaskExecLogColumns.BATCH_CODE.name(), batchCode);
		queryWrapper.eq(TaskExecLogColumns.TASK_CODE.name(), taskCode);
		return getBaseMapper().selectList(queryWrapper);
	}

	@Override
	public List<TaskExecLogPo> queryListByBatchId(Long batchId, Long batchTriggerTime) {
		QueryWrapper<TaskExecLogPo> queryWrapper = Wrappers.query();
		queryWrapper.eq(TaskExecLogColumns.BATCH_EXEC_LOG_ID.name(), batchId);
		if (batchTriggerTime != null && batchTriggerTime > 0) {
			queryWrapper.eq(TaskExecLogColumns.BATCH_TRIGGER_TIME.name(), batchTriggerTime);
		}
		return getBaseMapper().selectList(queryWrapper);
	}

	@Override
	public long count(TaskExecLogPo taskExecLogPo) {
		QueryWrapper<TaskExecLogPo> queryWrapper = createQuery(taskExecLogPo);
		return super.count(queryWrapper);
	}

	@Override
	public List<TaskExecLogPo> queryList(int index, int size, TaskExecLogPo taskExecLogPo) {
		QueryWrapper<TaskExecLogPo> queryWrapper = createQuery(taskExecLogPo);
		if (size > 0) {
			Page<TaskExecLogPo> page = new Page<>(index, size, false);
			return super.page(page, queryWrapper).getRecords();
		}
		// queryWrapper.orderBy(true, false, BatchInfoPoColumns.ID.name());
		return getBaseMapper().selectList(queryWrapper);
	}

	private QueryWrapper<TaskExecLogPo> createQuery(TaskExecLogPo taskExecLogPo) {
		QueryWrapper<TaskExecLogPo> queryWrapper = Wrappers.query();
		if (taskExecLogPo.getId() != null) {
			queryWrapper.eq(TaskExecLogColumns.ID.name(), taskExecLogPo.getId());
		}
		if (StringUtil.isNotEmpty(taskExecLogPo.getBizCode())) {
			queryWrapper.eq(TaskExecLogColumns.BIZ_CODE.name(), taskExecLogPo.getBizCode());
		}
		if (StringUtil.isNotEmpty(taskExecLogPo.getBatchCode())) {
			queryWrapper.eq(TaskExecLogColumns.BATCH_CODE.name(), taskExecLogPo.getBatchCode());
		}
		if (StringUtil.isNotEmpty(taskExecLogPo.getTaskCode())) {
			queryWrapper.eq(TaskExecLogColumns.TASK_CODE.name(), taskExecLogPo.getTaskCode());
		}
		if (taskExecLogPo.getBatchTriggerTime() != null) {
			queryWrapper.eq(TaskExecLogColumns.BATCH_TRIGGER_TIME.name(), taskExecLogPo.getBatchTriggerTime());
		}
		if (taskExecLogPo.getTaskTriggerTime() != null) {
			queryWrapper.eq(TaskExecLogColumns.TASK_TRIGGER_TIME.name(), taskExecLogPo.getTaskTriggerTime());
		}
		if (StringUtil.isNotEmpty(taskExecLogPo.getScheduleType())) {
			queryWrapper.eq(TaskExecLogColumns.SCHEDULE_TYPE.name(), taskExecLogPo.getScheduleType());
		}
		if (taskExecLogPo.getExecDate() != null) {
			queryWrapper.eq(TaskExecLogColumns.EXEC_DATE.name(), taskExecLogPo.getExecDate());
		}
		if (StringUtil.isNotEmpty(taskExecLogPo.getExecStatus())) {
			queryWrapper.eq(TaskExecLogColumns.EXEC_STATUS.name(), taskExecLogPo.getExecStatus());
		}
//        if (StringUtil.isNotEmpty(taskExecLogPo.getStartupTime())) {
//            queryWrapper.eq(TaskExecLogColumns.STARTUP_TIME.name(), taskExecLogPo.getStartupTime());
//        }
		// if (StringUtil.isNotEmpty(taskExecLogPo.getEndTime())) {
		// queryWrapper.eq(TaskExecLogColumns.END_TIME.name(),
		// taskExecLogPo.getEndTime());
		// }
		return queryWrapper;
	}

	@Override
	public TaskExecLogPo queryFirst(TaskExecLogPo taskExecLogPo) {
		QueryWrapper<TaskExecLogPo> queryWrapper = Wrappers.query();
		if (taskExecLogPo.getId() != null) {
			queryWrapper.eq(TaskExecLogColumns.ID.name(), taskExecLogPo.getId());
		}
		if (StringUtil.isNotEmpty(taskExecLogPo.getBizCode())) {
			queryWrapper.eq(TaskExecLogColumns.BIZ_CODE.name(), taskExecLogPo.getBizCode());
		}
		if (StringUtil.isNotEmpty(taskExecLogPo.getBatchCode())) {
			queryWrapper.eq(TaskExecLogColumns.BATCH_CODE.name(), taskExecLogPo.getBatchCode());
		}
		if (StringUtil.isNotEmpty(taskExecLogPo.getTaskCode())) {
			queryWrapper.eq(TaskExecLogColumns.TASK_CODE.name(), taskExecLogPo.getTaskCode());
		}
		if (taskExecLogPo.getBatchTriggerTime() != null) {
			queryWrapper.eq(TaskExecLogColumns.BATCH_TRIGGER_TIME.name(), taskExecLogPo.getBatchTriggerTime());
		}
		if (taskExecLogPo.getTaskTriggerTime() != null) {
			queryWrapper.eq(TaskExecLogColumns.TASK_TRIGGER_TIME.name(), taskExecLogPo.getTaskTriggerTime());
		}
		if (StringUtil.isNotEmpty(taskExecLogPo.getScheduleType())) {
			queryWrapper.eq(TaskExecLogColumns.SCHEDULE_TYPE.name(), taskExecLogPo.getScheduleType());
		}
		if (taskExecLogPo.getExecDate() != null) {
			queryWrapper.eq(TaskExecLogColumns.EXEC_DATE.name(), taskExecLogPo.getExecDate());
		}
		if (StringUtil.isNotEmpty(taskExecLogPo.getExecStatus())) {
			queryWrapper.eq(TaskExecLogColumns.EXEC_STATUS.name(), taskExecLogPo.getExecStatus());
		}
//        if (StringUtil.isNotEmpty(taskExecLogPo.getStartupTime())) {
//            queryWrapper.eq(TaskExecLogColumns.STARTUP_TIME.name(), taskExecLogPo.getStartupTime());
//        }
		// if (StringUtil.isNotEmpty(taskExecLogPo.getEndTime())) {
		// queryWrapper.eq(TaskExecLogColumns.END_TIME.name(),
		// taskExecLogPo.getEndTime());
		// }
		// queryWrapper.orderBy(true, false, TaskExecLogPoColumns.ID.name());
		return super.getOne(queryWrapper);
	}

	@Override
	public TaskExecLogPo queryById(Serializable id) {
		return super.getById(id);
	}

	@Override
	public boolean insert(TaskExecLogPo taskExecLogPo) {
//        taskExecLogPo.setVersion(1);
//        taskExecLogPo.setUpdateTime(new java.sql.Timestamp(System.currentTimeMillis()));
		return super.save(taskExecLogPo);
	}

	@Override
	public boolean insertBatch(List<TaskExecLogPo> listTaskExecLogPos) {
		int rs = getBaseMapper().insertBatchSomeColumn(listTaskExecLogPos);
		return SqlHelper.retBool(rs);
	}

	@Override
	public boolean updateById(TaskExecLogPo taskExecLogPo) {
		UpdateWrapper<TaskExecLogPo> updateWrapper = Wrappers.update();
		updateWrapper.eq(TaskExecLogColumns.ID.name(), taskExecLogPo.getId());
//        updateWrapper.eq(TaskExecLogColumns.VERSION.name(), taskExecLogPo.getVersion());
//        taskExecLogPo.setVersion(taskExecLogPo.getVersion() + 1);
		boolean rs = super.update(taskExecLogPo, updateWrapper);
		// 根据ID更新所有字段，空值也更新
		// int num = getBaseMapper().alwaysUpdateSomeColumnById(BatchInfoPo);
		// boolean rs = SqlHelper.retBool(num);
		if (!rs) {
			throw new UpdateZeroException();
		}
		return rs;
	}

	@Override
	public boolean updateByIdWithNull(TaskExecLogPo taskExecLogPo) {
		// 根据ID更新所有字段，空值也更新
		int num = getBaseMapper().alwaysUpdateSomeColumnById(taskExecLogPo);
		boolean rs = SqlHelper.retBool(num);
		if (!rs) {
			throw new UpdateZeroException();
		}
		return rs;
	}

	@Override
	public boolean deleteByIds(Serializable[] ids) {
		UpdateWrapper<TaskExecLogPo> updateWrapper = Wrappers.update();
		updateWrapper.in(TaskExecLogColumns.ID.name(), (Object[]) ids);
		return super.remove(updateWrapper);
	}

	@Override
	public boolean deleteByBatchLogIdAndCodes(Long batchLogId, Long batchTriggerTime,  String bizCode, String batchCode, String taskCode) {
		UpdateWrapper<TaskExecLogPo> updateWrapper = Wrappers.update();
		updateWrapper.eq(TaskExecLogColumns.BATCH_EXEC_LOG_ID.name(), batchLogId);
		updateWrapper.eq(TaskExecLogColumns.BATCH_TRIGGER_TIME.name(), batchTriggerTime);
		updateWrapper.eq(TaskExecLogColumns.BIZ_CODE.name(), bizCode);
		updateWrapper.eq(TaskExecLogColumns.BATCH_CODE.name(), batchCode);
		updateWrapper.eq(TaskExecLogColumns.TASK_CODE.name(), taskCode);
		return super.remove(updateWrapper);
	}

//    public TaskExecLogPo queryByExample(TaskExecLogPo taskExecLogPo) {
//        QueryWrapper<TaskExecLogPo> queryWrapper = Wrappers.query();
//        if (taskExecLogPo.getId() != null) {
//            queryWrapper.eq(TaskExecLogColumns.ID.name(), taskExecLogPo.getId());
//        }
//        if (StringUtil.isNotEmpty(taskExecLogPo.getBizCode())) {
//            queryWrapper.eq(TaskExecLogColumns.BIZ_CODE.name(), taskExecLogPo.getBizCode());
//        }
//        if (StringUtil.isNotEmpty(taskExecLogPo.getBatchCode())) {
//            queryWrapper.eq(TaskExecLogColumns.BATCH_CODE.name(), taskExecLogPo.getBatchCode());
//        }
//        if (StringUtil.isNotEmpty(taskExecLogPo.getTaskCode())) {
//            queryWrapper.eq(TaskExecLogColumns.TASK_CODE.name(), taskExecLogPo.getTaskCode());
//        }
//        if (taskExecLogPo.getBatchTriggerTime() != null) {
//            queryWrapper.eq(TaskExecLogColumns.BATCH_TRIGGER_TIME.name(), taskExecLogPo.getBatchTriggerTime());
//        }
//        if (taskExecLogPo.getTaskTriggerTime() != null) {
//            queryWrapper.eq(TaskExecLogColumns.TASK_TRIGGER_TIME.name(), taskExecLogPo.getTaskTriggerTime());
//        }
//        if (StringUtil.isNotEmpty(taskExecLogPo.getDbCode())) {
//            queryWrapper.eq(TaskExecLogColumns.DB_CODE.name(), taskExecLogPo.getDbCode());
//        }
//        if (StringUtil.isNotEmpty(taskExecLogPo.getScheduleType())) {
//            queryWrapper.eq(TaskExecLogColumns.SCHEDULE_TYPE.name(), taskExecLogPo.getScheduleType());
//        }
//        if (taskExecLogPo.getExecDate() != null) {
//            queryWrapper.eq(TaskExecLogColumns.EXEC_DATE.name(), taskExecLogPo.getExecDate());
//        }
//        if (StringUtil.isNotEmpty(taskExecLogPo.getExecStatus())) {
//            queryWrapper.eq(TaskExecLogColumns.EXEC_STATUS.name(), taskExecLogPo.getExecStatus());
//        }
//        if (StringUtil.isNotEmpty(taskExecLogPo.getStartupTime())) {
//            queryWrapper.eq(TaskExecLogColumns.STARTUP_TIME.name(), taskExecLogPo.getStartupTime());
//        }
//        if (StringUtil.isNotEmpty(taskExecLogPo.getEndTime())) {
//            queryWrapper.eq(TaskExecLogColumns.END_TIME.name(), taskExecLogPo.getEndTime());
//        }
//		Page<TaskExecLogPo> page = new Page<>(0, 1, false);
//		queryWrapper.orderBy(true, false, TaskExecLogPoColumns.ID.name());
//    }

}
